package com.meatball.base.repository.matcher;

import org.springframework.data.util.ProxyUtils;

public interface MeatballExample<T> {

    /**
     * @title: of
     * @description: todo(创建一个新的构造器，默认包含所有非空属性)
     * @params: [probe]
     * @return: com.meatball.base.repository.matcher.MeatballExample<T>    返回类型
     * @author: 張翔宇
     * @date: 2019/4/11 16:44
     */
//    static <T> MeatballExample<T> of(T probe) {
//        return new TypedMeatballExample<>(probe, MeatballMatcher.matching());
//    }

    /**
     * @title: of
     * @description: todo(使用给定的{@link ExampleMatcher}创建一个新的{@link示例})
     * @params: [probe, matcher]
     * @return: com.meatball.base.repository.matcher.MeatballExample<T>    返回类型
     * @author: 張翔宇
     * @date: 2019/4/11 16:45
     */
    static <T> MeatballExample<T> of(T probe, MeatballMatcher matcher) {
        return new TypedMeatballExample<>(probe, matcher);
    }

    /** 
     * @title: getProbe
     * @description: todo() 
     * @params: []
     * @return: T    返回类型 
     * @author: 張翔宇
     * @date: 2019/4/11 16:46 
     */
    T getProbe();

    /** 
     * @title: getMatcher
     * @description: todo() 
     * @params: []
     * @return: com.meatball.base.repository.matcher.MeatballMatcher    返回类型 
     * @author: 張翔宇
     * @date: 2019/4/11 16:46 
     */
    MeatballMatcher getMatcher();

    /** 
     * @title: getProbeType
     * @description: todo() 
     * @params: []
     * @return: java.lang.Class<T>    返回类型 
     * @author: 張翔宇
     * @date: 2019/4/11 17:21
     */
    default Class<T> getProbeType() {
        return (Class<T>) ProxyUtils.getUserClass(getProbe().getClass());
    }
}
